<!DOCTYPE html>
            
<HTML>
<HEAD>
<meta name="booktitle" content="Developing Applications With Objective Caml" >
 <meta charset="ISO-8859-1"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<META name="GENERATOR" content="hevea 1.05-7 of 2000-02-24">
<META NAME="Author" CONTENT="Christian.Queinnec@lip6.fr">
<LINK rel=stylesheet type="text/css" href="videoc-ocda.css">
<script language="JavaScript" src="videoc.js"><!--
//--></script>
<TITLE>
 Exercises
</TITLE>
</HEAD>
<BODY class="regularBody">
<A HREF="book-ora107.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora109.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
<HR>

<H2> Exercises</H2>
<A NAME="toc145"></A>
<H3> Filtering Comments Out</H3>
Comments in Objective CAML are hierarchical. We can thus comment away
sections of text, including those containing comments. A comment
starts with characters <CODE>(*</CODE> and finishes with <CODE>*)</CODE>. Here's
an example:


<PRE><BR><CODE>(* comment spread</CODE><BR><CODE>      over several</CODE><BR><CODE>        lines *)</CODE><BR><BR><CODE> </CODE><B>let</B><CODE> </CODE>succ<CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>(* successor function *)</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>x<CODE> </CODE><CODE>+</CODE><CODE> </CODE><CODE>1</CODE>;;<BR><BR><CODE>(* level 1 commented text</CODE><BR><CODE>  let old_succ y = (* level 2 successor function level 2 *)</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>y<CODE> </CODE><CODE>+</CODE><CODE>1</CODE>;;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>level<CODE> </CODE><CODE>1</CODE><CODE> </CODE><CODE>*</CODE><TT>)</TT><BR><CODE> </CODE><CODE> </CODE>succ<CODE> </CODE><CODE>2</CODE>;;<BR>

</PRE>

The aim of this exercise is to create a new text without comments. You
are free to choose whatever lexical analysis tool you wish.<BR>
<BR>
<OL type=1>
<LI>
 Write a <A id="a221__1_APPEND/AlexScor.ml.tex" href="javascript: void showMessage('1_APPEND/AlexScor.ml.tex')" class="mousable"><SPAN style=""><!-- 1,APPEND/AlexScor.ml.tex,commentlexer -->lexer</SPAN></A> able to recognize Objective CAML 
comments. These start with a <CODE>(*</CODE> and end with a <CODE>*)</CODE>. 
Your lexer should ensure
comments are balanced, that is to say the number of comment
openings equals the number of comment closings.
We are not interested in other constructions in the language which
may contain characters <CODE>(*</CODE> and <CODE>*)</CODE>.
<!-- POPUP DEFINITION -->
<layer id="l__1_APPEND/AlexScor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","1_APPEND/AlexScor.ml.tex","");
// --></script><span style="">
 

<PRE>
<CODE>(** fichier comment1.mll **)</CODE><BR><BR>{<BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>ignore_lex<CODE> </CODE>lb<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ignore<CODE> </CODE><TT>(</TT>Lexing.lexeme<CODE> </CODE>lb<TT>)</TT><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>traite_normal<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ignore_lex<BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>traite_comment<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ignore_lex<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>exception</B><CODE> </CODE>Commentaires_mal_balances<BR>}<BR><BR>rule<CODE> </CODE>normal<CODE> </CODE><CODE>=</CODE><CODE> </CODE>parse<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>"(*"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>ignore_lex<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>normal<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>"*)"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>raise<CODE> </CODE>Commentaires_mal_balances<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_normal<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>normal<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>eof<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>()<CODE> </CODE>}<BR><BR><B>and</B><CODE> </CODE>commentaire<CODE> </CODE><CODE>=</CODE><CODE> </CODE>parse<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>"(*"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>ignore_lex<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>"*)"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>ignore_lex<CODE> </CODE>lexbuf<CODE> </CODE><CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_comment<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>eof<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>raise<CODE> </CODE>Commentaires_mal_balances<CODE> </CODE>}<BR><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("1_APPEND/AlexScor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a <A id="a222__2_APPEND/AlexScor.ml.tex" href="javascript: void showMessage('2_APPEND/AlexScor.ml.tex')" class="mousable"><SPAN style=""><!-- 2,APPEND/AlexScor.ml.tex,comments -->program</SPAN></A> which takes a file, reads it, 
filters comments away and writes a new file with the remaining text.
<!-- POPUP DEFINITION -->
<layer id="l__2_APPEND/AlexScor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","2_APPEND/AlexScor.ml.tex","");
// --></script><span style="">
 

<PRE>
<CODE>(** fichier comment2.mll **)</CODE><BR>{<BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>ignore_lex<CODE> </CODE>lb<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ignore<CODE> </CODE><TT>(</TT>Lexing.lexeme<CODE> </CODE>lb<TT>)</TT><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>sortie<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE>stdout<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>init_sortie<CODE> </CODE>f<CODE> </CODE><CODE>=</CODE><CODE> </CODE>sortie<CODE> </CODE><CODE>:=</CODE><CODE> </CODE>f<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>traite_normal<CODE> </CODE>lb<CODE> </CODE><CODE>=</CODE><CODE> </CODE>output_string<CODE> </CODE><CODE>!</CODE>sortie<CODE> </CODE><TT>(</TT>Lexing.lexeme<CODE> </CODE>lb<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>traite_comment<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ignore_lex<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>exception</B><CODE> </CODE>Commentaires_mal_balances<BR>}<BR><BR>rule<CODE> </CODE>normal<CODE> </CODE><CODE>=</CODE><CODE> </CODE>parse<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>"(*"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>ignore_lex<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>normal<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>"*)"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>raise<CODE> </CODE>Commentaires_mal_balances<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_normal<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>normal<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>eof<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>()<CODE> </CODE>}<BR><BR><B>and</B><CODE> </CODE>commentaire<CODE> </CODE><CODE>=</CODE><CODE> </CODE>parse<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>"(*"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>ignore_lex<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>"*)"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>ignore_lex<CODE> </CODE>lexbuf<CODE> </CODE><CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_comment<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>eof<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>raise<CODE> </CODE>Commentaires_mal_balances<CODE> </CODE>}<BR><BR><BR>{<BR><BR><B>let</B><CODE> </CODE>decommente<CODE> </CODE>src<CODE> </CODE>dest<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>file_in<CODE> </CODE><CODE>=</CODE><CODE> </CODE>open_in<CODE> </CODE>src<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>lb<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Lexing.from_channel<CODE> </CODE>file_in<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>file_out<CODE> </CODE><CODE>=</CODE><CODE> </CODE>open_out<CODE> </CODE>dest<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>init_sortie<CODE> </CODE>file_out<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>normal<CODE> </CODE>lb<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>close_in<CODE> </CODE>file_in<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>close_out<CODE> </CODE>file_out<CODE> </CODE>;;<BR><BR><B>let</B><CODE> </CODE>usage<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE>print_string<CODE> </CODE><CODE>"comment2 filein fileout"</CODE>;<BR><CODE> </CODE><CODE> </CODE>print_newline()<CODE> </CODE>;;<BR><BR><CODE> </CODE><CODE> </CODE><BR><B>let</B><CODE> </CODE>main<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>Array.length<CODE> </CODE><TT>(</TT>Sys.argv<TT>)</TT><CODE> </CODE><CODE>&lt;&gt;</CODE><CODE> </CODE><CODE>3</CODE><CODE> </CODE><B>then</B><CODE> </CODE>usage<CODE> </CODE>()<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE>decommente<CODE> </CODE>Sys.argv<CODE>.</CODE><TT>(</TT><CODE>1</CODE><TT>)</TT><CODE> </CODE>Sys.argv<CODE>.</CODE><TT>(</TT><CODE>2</CODE><TT>)</TT><CODE> </CODE>;;<BR><BR>main<CODE> </CODE>();;<BR><CODE> </CODE><CODE> </CODE>}<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("2_APPEND/AlexScor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> In Objective CAML character strings may contain any character,
even the sequences <CODE>(*</CODE> and <CODE>*)</CODE>. For example, character
string <CODE>"what(*ever te*)xt"</CODE> should not be considered a
comment. <A id="a223__3_APPEND/AlexScor.ml.tex" href="javascript: void showMessage('3_APPEND/AlexScor.ml.tex')" class="mousable"><SPAN style=""><!-- 3,APPEND/AlexScor.ml.tex,commentlexerstring -->Modify</SPAN></A> your lexer to consider 
character strings.
<!-- POPUP DEFINITION -->
<layer id="l__3_APPEND/AlexScor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","3_APPEND/AlexScor.ml.tex","");
// --></script><span style="">
 

<PRE>
<CODE>(** fichier comment3.mll **)</CODE><BR>{<BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>ignore_lex<CODE> </CODE>lb<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ignore<CODE> </CODE><TT>(</TT>Lexing.lexeme<CODE> </CODE>lb<TT>)</TT><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>sortie<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE>stdout<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>init_sortie<CODE> </CODE>f<CODE> </CODE><CODE>=</CODE><CODE> </CODE>sortie<CODE> </CODE><CODE>:=</CODE><CODE> </CODE>f<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>traite_normal<CODE> </CODE>lb<CODE> </CODE><CODE>=</CODE><CODE> </CODE>output_string<CODE> </CODE><CODE>!</CODE>sortie<CODE> </CODE><TT>(</TT>Lexing.lexeme<CODE> </CODE>lb<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>traite_comment<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ignore_lex<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>exception</B><CODE> </CODE>Commentaires_mal_balances<BR>}<BR><BR>rule<CODE> </CODE>normal<CODE> </CODE><CODE>=</CODE><CODE> </CODE>parse<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>"(*"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>ignore_lex<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>normal<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>"*)"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>raise<CODE> </CODE>Commentaires_mal_balances<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'"'</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_normal<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>chaine<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>normal<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_normal<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>normal<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>eof<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>()<CODE> </CODE>}<BR><BR><B>and</B><CODE> </CODE>commentaire<CODE> </CODE><CODE>=</CODE><CODE> </CODE>parse<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>"(*"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>ignore_lex<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>"*)"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>ignore_lex<CODE> </CODE>lexbuf<CODE> </CODE><CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_comment<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>eof<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>raise<CODE> </CODE>Commentaires_mal_balances<CODE> </CODE>}<BR><BR><B>and</B><CODE> </CODE><CODE> </CODE>chaine<CODE> </CODE><CODE>=</CODE><CODE> </CODE>parse<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>'"'</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_normal<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>()<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>"\\\""</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_normal<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>chaine<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_normal<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>chaine<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><BR><BR><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("3_APPEND/AlexScor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Use this new lexer to remove comments from an
Objective CAML <A id="a224__4_APPEND/AlexScor.ml.tex" href="javascript: void showMessage('4_APPEND/AlexScor.ml.tex')" class="mousable"><SPAN style=""><!-- 4,APPEND/AlexScor.ml.tex,commentstring -->program</SPAN></A> . 
<!-- POPUP DEFINITION -->
<layer id="l__4_APPEND/AlexScor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","4_APPEND/AlexScor.ml.tex","");
// --></script><span style="">
 

<PRE>
<CODE>(** fichier comment4.mll **)</CODE><BR>{<BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>ignore_lex<CODE> </CODE>lb<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ignore<CODE> </CODE><TT>(</TT>Lexing.lexeme<CODE> </CODE>lb<TT>)</TT><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>sortie<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE>stdout<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>init_sortie<CODE> </CODE>f<CODE> </CODE><CODE>=</CODE><CODE> </CODE>sortie<CODE> </CODE><CODE>:=</CODE><CODE> </CODE>f<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>traite_normal<CODE> </CODE>lb<CODE> </CODE><CODE>=</CODE><CODE> </CODE>output_string<CODE> </CODE><CODE>!</CODE>sortie<CODE> </CODE><TT>(</TT>Lexing.lexeme<CODE> </CODE>lb<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>traite_comment<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ignore_lex<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>exception</B><CODE> </CODE>Commentaires_mal_balances<BR>}<BR><BR>rule<CODE> </CODE>normal<CODE> </CODE><CODE>=</CODE><CODE> </CODE>parse<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>"(*"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>ignore_lex<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>normal<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>"*)"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>raise<CODE> </CODE>Commentaires_mal_balances<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'"'</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_normal<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>chaine<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>normal<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_normal<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>normal<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>eof<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>()<CODE> </CODE>}<BR><BR><B>and</B><CODE> </CODE>commentaire<CODE> </CODE><CODE>=</CODE><CODE> </CODE>parse<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>"(*"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>ignore_lex<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>"*)"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>ignore_lex<CODE> </CODE>lexbuf<CODE> </CODE><CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_comment<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>commentaire<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>eof<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>raise<CODE> </CODE>Commentaires_mal_balances<CODE> </CODE>}<BR><BR><B>and</B><CODE> </CODE><CODE> </CODE>chaine<CODE> </CODE><CODE>=</CODE><CODE> </CODE>parse<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>'"'</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_normal<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>()<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>"\\\""</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_normal<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>chaine<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>traite_normal<CODE> </CODE>lexbuf<CODE> </CODE>;<CODE> </CODE>chaine<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><BR><BR>{<BR><BR><B>let</B><CODE> </CODE>decommente<CODE> </CODE>src<CODE> </CODE>dest<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>file_in<CODE> </CODE><CODE>=</CODE><CODE> </CODE>open_in<CODE> </CODE>src<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>lb<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Lexing.from_channel<CODE> </CODE>file_in<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>file_out<CODE> </CODE><CODE>=</CODE><CODE> </CODE>open_out<CODE> </CODE>dest<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>init_sortie<CODE> </CODE>file_out<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>normal<CODE> </CODE>lb<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>close_in<CODE> </CODE>file_in<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>close_out<CODE> </CODE>file_out<CODE> </CODE>;;<BR><BR><B>let</B><CODE> </CODE>usage<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE>print_string<CODE> </CODE><CODE>"comment2 filein fileout"</CODE>;<BR><CODE> </CODE><CODE> </CODE>print_newline()<CODE> </CODE>;;<BR><BR><CODE> </CODE><CODE> </CODE><BR><B>let</B><CODE> </CODE>main<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>Array.length<CODE> </CODE><TT>(</TT>Sys.argv<TT>)</TT><CODE> </CODE><CODE>&lt;&gt;</CODE><CODE> </CODE><CODE>3</CODE><CODE> </CODE><B>then</B><CODE> </CODE>usage<CODE> </CODE>()<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE>decommente<CODE> </CODE>Sys.argv<CODE>.</CODE><TT>(</TT><CODE>1</CODE><TT>)</TT><CODE> </CODE>Sys.argv<CODE>.</CODE><TT>(</TT><CODE>2</CODE><TT>)</TT><CODE> </CODE>;;<BR><BR>main<CODE> </CODE>();;<BR><CODE> </CODE><CODE> </CODE>}<BR><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("4_APPEND/AlexScor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL><A NAME="toc146"></A>
<H3> Evaluator</H3>
We will use <TT>ocamlyacc</TT> to implement an expression
 evaluator. The idea is to perform the evaluation of
 expressions directly in the grammar rules.<BR>
<BR>
We choose a (completely parenthesized) prefix arithmetic expression
language with variable arity operators. For example, expression
<TT>(ADD e1 e2 .. en)</TT> is equivalent to <TT>e1 + e2 + .. + en</TT>. Plus
and times operators are right-associative and subtraction and
division are left-associative. 
<OL type=1>
<LI> Define in file <TT><A id="a225__5_APPEND/AlexScor.ml.tex" href="javascript: void showMessage('5_APPEND/AlexScor.ml.tex')" class="mousable"><SPAN style=""><!-- 5,APPEND/AlexScor.ml.tex,opnparser -->opn_parser</SPAN></A>.mly</TT> the 
parsing and evaluation rules for an expression.
<!-- POPUP DEFINITION -->
<layer id="l__5_APPEND/AlexScor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","5_APPEND/AlexScor.ml.tex","");
// --></script><span style="">
 

<PRE><BR><CODE>%{</CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>app_right<CODE> </CODE>f<CODE> </CODE>xs<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>match</B><CODE> </CODE>xs<CODE> </CODE><B>with</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>[</CODE>x<CODE>]</CODE><CODE> </CODE>-&gt;<CODE> </CODE>x<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>x::xs<CODE> </CODE>-&gt;<CODE> </CODE>f<CODE> </CODE>x<CODE> </CODE><TT>(</TT>app_right<CODE> </CODE>f<CODE> </CODE>xs<TT>)</TT><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE>-&gt;<CODE> </CODE>failwith<CODE>"missing argument"</CODE><CODE> </CODE>;;<BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>app_left<CODE> </CODE>f<CODE> </CODE>xs<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>match</B><CODE> </CODE>xs<CODE> </CODE><B>with</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>[</CODE>x<CODE>]</CODE><CODE> </CODE>-&gt;<CODE> </CODE>x<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>x1::x2::xs<CODE> </CODE>-&gt;<CODE> </CODE>app_left<CODE> </CODE>f<CODE> </CODE><TT>(</TT><TT>(</TT>f<CODE> </CODE>x1<CODE> </CODE>x2<TT>)</TT>::xs<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE>-&gt;<CODE> </CODE>failwith<CODE>"missing argument"</CODE><CODE> </CODE>;;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>t<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Hashtbl.create<CODE> </CODE><CODE>3</CODE><CODE> </CODE>;;<BR><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><TT>(</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Hashtbl.add<CODE> </CODE>t<CODE> </CODE><CODE>"ADD"</CODE><CODE> </CODE><TT>(</TT>app_right<CODE> </CODE><TT>(</TT><CODE>+.</CODE><TT>)</TT><TT>)</TT>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Hashtbl.add<CODE> </CODE>t<CODE> </CODE><CODE>"SUB"</CODE><CODE> </CODE><TT>(</TT>app_left<CODE> </CODE><TT>(</TT><CODE>-.</CODE><TT>)</TT><TT>)</TT>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Hashtbl.add<CODE> </CODE>t<CODE> </CODE><CODE>"MUL"</CODE><CODE> </CODE><TT>(</TT>app_right<CODE> </CODE><TT>(</TT><CODE> </CODE><CODE>*.</CODE><TT>)</TT><TT>)</TT>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Hashtbl.add<CODE> </CODE>t<CODE> </CODE><CODE>"DIV"</CODE><CODE> </CODE><TT>(</TT>app_left<CODE> </CODE><TT>(</TT><CODE>/.</CODE><TT>)</TT><TT>)</TT><BR><CODE> </CODE><CODE> </CODE><TT>)</TT><CODE> </CODE>;;<BR><BR><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>apply<CODE> </CODE>o<CODE> </CODE>vs<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>try</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><TT>(</TT>Hashtbl.find<CODE> </CODE>t<CODE> </CODE>o<TT>)</TT><CODE> </CODE>vs<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Not_found<CODE> </CODE>-&gt;<CODE> </CODE><TT>(</TT>Printf.eprintf<CODE>"Unknown operator %s\n"</CODE><CODE> </CODE>o;<CODE> </CODE>exit<TT>(</TT><CODE>1</CODE><TT>)</TT><TT>)</TT><CODE> </CODE>;;<BR><CODE>%}</CODE><BR><BR><CODE>%</CODE>token<CODE> </CODE>Lpar<CODE> </CODE>Rpar<BR><CODE>%</CODE>token<CODE> </CODE><CODE>&lt;</CODE>float<CODE>&gt;</CODE><CODE> </CODE>Num<BR><CODE>%</CODE>token<CODE> </CODE><CODE>&lt;</CODE>string<CODE>&gt;</CODE><CODE> </CODE>Atom<BR><BR><CODE>%</CODE>start<CODE> </CODE>term<BR><CODE>%</CODE><B>type</B><CODE> </CODE><CODE>&lt;</CODE>float<CODE>&gt;</CODE><CODE> </CODE>term<BR><CODE>%</CODE><B>type</B><CODE> </CODE><CODE>&lt;</CODE>float<CODE> </CODE>list<CODE>&gt;</CODE><CODE> </CODE>terms<BR><BR><CODE>%%</CODE><BR>term<CODE> </CODE><CODE>:</CODE><BR><CODE> </CODE><CODE> </CODE>Num<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE><CODE>$</CODE><CODE>1</CODE><CODE> </CODE>}<BR><CODE>|</CODE><CODE> </CODE>Lpar<CODE> </CODE>Atom<CODE> </CODE>terms<CODE> </CODE>Rpar<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE><TT>(</TT>apply<CODE> </CODE><CODE>$</CODE><CODE>2</CODE><CODE> </CODE><CODE>$</CODE><CODE>3</CODE><TT>)</TT><CODE> </CODE>}<BR>;<BR>terms<CODE> </CODE><CODE>:</CODE><BR><CODE> </CODE><CODE> </CODE>term<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE><CODE>[$</CODE><CODE>1</CODE><CODE>]</CODE><CODE> </CODE>}<BR><CODE>|</CODE><CODE> </CODE>term<CODE> </CODE>terms<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE><CODE>$</CODE><CODE>1</CODE><CODE>::$</CODE><CODE>2</CODE><CODE> </CODE>}<BR>;<BR><CODE>%%</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("5_APPEND/AlexScor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Define in file <TT><A id="a226__6_APPEND/AlexScor.ml.tex" href="javascript: void showMessage('6_APPEND/AlexScor.ml.tex')" class="mousable"><SPAN style=""><!-- 6,APPEND/AlexScor.ml.tex,opnlexer -->opn_lexer.mll</SPAN></A></TT> the 
lexical analysis of expressions.
<!-- POPUP DEFINITION -->
<layer id="l__6_APPEND/AlexScor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","6_APPEND/AlexScor.ml.tex","");
// --></script><span style="">
 

<PRE><BR>{<BR><CODE> </CODE><CODE> </CODE><B>open</B><CODE> </CODE>Opn_parser<CODE> </CODE><BR>}<BR><BR>rule<CODE> </CODE>lexer<CODE> </CODE><CODE>=</CODE><CODE> </CODE>parse<BR><CODE> </CODE><CODE> </CODE><CODE>[</CODE><CODE>' '</CODE><CODE> </CODE><CODE>'\n'</CODE><CODE>]</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>lexer<CODE> </CODE>lexbuf<CODE> </CODE>}<BR><CODE>|</CODE><CODE> </CODE><CODE>'('</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>Lpar<CODE> </CODE>}<BR><CODE>|</CODE><CODE> </CODE><CODE>')'</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>Rpar<CODE> </CODE>}<BR><CODE>|</CODE><CODE> </CODE><CODE>'-'</CODE><CODE>?[</CODE><CODE>'0'</CODE><CODE>-</CODE><CODE>'9'</CODE><CODE>]*</CODE><CODE>'.'</CODE><CODE>?[</CODE><CODE>'0'</CODE><CODE>-</CODE><CODE>'9'</CODE><CODE>]*</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>Num<CODE> </CODE><TT>(</TT>float_of_string<CODE> </CODE><TT>(</TT>Lexing.lexeme<CODE> </CODE>lexbuf<TT>)</TT><TT>)</TT><CODE> </CODE>}<BR><CODE>|</CODE><CODE> </CODE><CODE>[</CODE><CODE>'A'</CODE><CODE>-</CODE><CODE>'z'</CODE><CODE>]+</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>Atom<CODE> </CODE><TT>(</TT>Lexing.lexeme<CODE> </CODE>lexbuf<TT>)</TT><CODE> </CODE>}<BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("6_APPEND/AlexScor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a simple main <A id="a227__7_APPEND/AlexScor.ml.tex" href="javascript: void showMessage('7_APPEND/AlexScor.ml.tex')" class="mousable"><SPAN style=""><!-- 7,APPEND/AlexScor.ml.tex,opnmain -->program</SPAN></A> <TT>opn</TT> which reads 
a line from standard input containing an expression and prints the
result of evaluating the expression.
<!-- POPUP DEFINITION -->
<layer id="l__7_APPEND/AlexScor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","7_APPEND/AlexScor.ml.tex","");
// --></script><span style="">
 

<PRE><BR><B>open</B><CODE> </CODE>Opn_lexer<CODE> </CODE>;;<BR><B>open</B><CODE> </CODE>Opn_parser<CODE> </CODE>;;<BR><BR>Printf.printf<CODE>"? "</CODE>;<CODE> </CODE>flush<CODE> </CODE>stdout;<BR><B>let</B><CODE> </CODE>buf<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Lexing.from_string<CODE> </CODE><TT>(</TT>input_line<CODE> </CODE>stdin<TT>)</TT><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"= %f\n"</CODE><CODE> </CODE><TT>(</TT>Opn_parser.term<CODE> </CODE>Opn_lexer.lexer<CODE> </CODE>buf<TT>)</TT><CODE> </CODE>;;<CODE> </CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("7_APPEND/AlexScor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL><HR>
<A HREF="book-ora107.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora109.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
</BODY>
</HTML>
